#! /usr/bin/python3
from menu import *
from trade import *
from record import *
from visualize import *

# 实例化
strategy=strategy()
visualize=visualize()
menu=menu()

# 无限循环，由用户主动决定什么时候退出循环！
while True:
    menu.show_menu()    # 显示功能菜单
    action_str = input("请选择希望执行的操作：")    # 提示操作
    print("您选择的操作是【%s】" % action_str)
    # 使用系统功能
    if action_str in ['1','2','3']:
        start_date=input('请输入起始日期（格式为20XX-XX-XX）：')
        end_date = input('请输入终止日期（格式为20XX-XX-XX，且晚于起始日期）：')
        date_list = stock.get_trade_dates(start_date, end_date) # 获取交易日列表
        print('成功获取交易日列表！')
        # 持有多支股票，前两个策略属于选股策略，最后一个为择时策略
        if action_str == "1":
            initial_capital = input('请输入初始资金：')
            menu.show_strategy()
            choice=input("请选择一种策略买入股票：(请输入数字)")
            data=pkl.read_pkl('data.pkl')

            # 策略一:第一次先以收盘价买入当日涨幅最大的股票，每次调仓卖出持有的全部股票，并买入近三天涨幅最大的股票
            if choice == '1': # 2015年以后的
                period = int(input('请输入调仓周期（以交易日为单位，请输入一个整数）:'))
                num = int(input('请输入最大持有股票数量（建议不超过5只）：'))
                # 执行策略，输出的是字典{调仓日期：买入股票}
                try:
                    stock_dict=strategy.strategy_1(start_date,end_date,data,period,num)
                except:
                    print('输入有误！')
                # 执行回测及日志
                trader(date_list, stock_dict, data, initial_capital, period, num)
            # 策略二：第一次先以收盘价买入当日跌幅最大的股票，每次调仓卖出持有的全部股票，并买入近三天跌幅最大的股票(反面教材)
            elif choice =='2':
                period = int(input('请输入调仓周期（以交易日为单位，请输入一个整数）:'))
                num = int(input('请输入最大持有股票数量（建议不超过5只）：'))
                # 执行策略，输出的是字典{调仓日期：买入股票}
                try:
                    stock_dict = strategy.strategy_2(start_date, end_date, data, period, num)
                except:
                    print('输入有误！')
                # 执行回测及日志输出
                trader(date_list, stock_dict, data, initial_capital, period, num)

            # 策略三：将资金均分给每只股票，每只股票都按照移动均线策略选择买入和卖出的时机
            elif choice =='3':
                data=pkl.read_pkl('newdata.pkl')
                deal=trade(start_date,end_date,initial_capital,data).stock
            else:
                print('输入错误！')

        #查看单只股票的历史数据
        elif action_str == "2":
            name = input('请输入股票代码或名称:')
            try:
                list=stock.stock_code(name)
                stock_name=list[0]
                code=list[1]
                data_df=stock.get_a_stock(code,start_date,end_date)
                print(data_df)
                data_df.to_csv("./{}.csv".format(code), index=True)        # 将data_df保存到本地CSV文件
                print('数据已经保存到当前目录下%s.csv文件下'%code)
                code=pkl.code_rev(code)
                stock_dat = visualize.get_data(code, start=start_date, end=end_date)
                visualize.show_detail(stock_dat.copy(deep=True), stock_name)
            except:
                print('输入有误！')
        elif action_str == "3":
            code=input('请输入股票代码：')
            try:
                trade_date=strategy.backtest(code,start_date,end_date)  # 使用移动均线交叉策略对任意一只A股量化回测分析
            except:
                print('输入有误！')
    elif action_str == "0":
        print("欢迎再次使用【量化回测系统】")
        break
    # 其他内容输入错误，提示用户
    else:
        print("您输入的不正确，请重新选择")







